package com.lurenjia.pets_adoption.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lurenjia.pets_adoption.dto.R;
import com.lurenjia.pets_adoption.entity.Users;
import com.lurenjia.pets_adoption.service.IUsersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

/**
 * 用户管理及登录注册前端控制器
 * <p>
 * 提供用户相关的所有功能接口，包括用户登录、注册、登出、用户信息管理、
 * 用户类型及状态修改等操作。支持多种登录方式和用户信息维护功能。
 *
 * @module 用户管理及登录注册
 */
@RestController
@RequestMapping("/users")
@Slf4j
public class UsersController {

    @Autowired
    private IUsersService usersService;

    /**
     * 通过手机验证码登录系统
     * <p>
     * 用户输入手机号和验证码进行身份验证并登录系统。
     *
     * @param phone   用户手机号
     * @param code    验证码
     * @param session 用户会话信息，用于存储登录状态
     * @return 登录操作结果响应
     */
    @GetMapping("/loginByPhone")
    public R<String> loginByPhone(String phone,String code,HttpSession session){
        log.info("登录手机号：{} 验证码：{}",phone,code);
        R<String> resp= usersService.loginByPhone(phone,code,session);
        return resp;
    }

    /**
     * 发送手机验证码
     * <p>
     * 向指定手机号发送验证码短信，用于手机登录验证。
     *
     * @param phone   接收验证码的手机号
     * @param session 用户会话信息，用于存储验证码
     * @return 验证码发送结果响应
     */
    @GetMapping("/sendMsg")
    public R<String> sendMsg(String phone,HttpSession session){
        log.info("申请验证码的手机号：{}",phone);
        R<String> resp = usersService.sendMsg( phone, session);
        return resp;
    }

    /**
     * 获取当前操作用户类型
     * <p>
     * 获取当前登录用户的用户类型，用于前端界面权限控制。
     *
     * @param session 用户会话信息，用于获取当前用户信息
     * @return 包含用户类型的响应结果，0为普通用户，1为管理员
     */
    @GetMapping("/type")
    public R<Integer> type(HttpSession session) {
        log.info("获取当前操作用户类型");
        Users user = (Users) session.getAttribute("user");
        Integer type = (user.getUserType()==null)?0:user.getUserType();
        return R.success(type);
    }

    /**
     * 获取当前用户信息
     * <p>
     * 获取当前登录用户的完整信息，用于前端展示用户个人资料。
     *
     * @param session 用户会话信息，用于获取当前用户信息
     * @return 包含当前用户信息的响应结果
     */
    @GetMapping
    public R<Users> users(HttpSession session){
        log.info("获取当前操作用户信息");
        Users user = (Users) session.getAttribute("user");

        if(user!=null){
            return R.success(user);
        }
        return R.error("没有登录嗷嗷~");
    }

    /**
     * 账户密码登录
     * <p>
     * 通过用户名和密码进行身份验证并登录系统。
     *
     * @param users   包含用户账号和密码的用户对象
     * @param session 用户会话信息，用于存储登录状态
     * @return 登录操作结果响应
     */
    @PostMapping("/login")
    public R<String> login(@RequestBody Users users, HttpSession session) {
        log.info("请求登录用户为：{}", users.getUserAccount());
        R<String> resp = usersService.login(users,session);
        return resp;
    }

    /**
     * 用户注册操作
     * <p>
     * 新用户通过填写注册信息创建账户。
     *
     * @param users 包含注册信息的用户对象
     * @return 注册操作结果响应
     */
    @PostMapping("/logon")
    public R<String> lonon(@RequestBody Users users) {
        log.info("请求注册用户为：{}", users);
        R<String> resp = usersService.logon(users);
        return resp;
    }

    /**
     * 用户登出操作
     * <p>
     * 清除用户的登录状态，安全退出系统。
     *
     * @param session 用户会话信息，用于清除登录状态
     * @return 登出操作结果响应
     */
    @PostMapping("/logout")
    public R<String> logout(HttpSession session) {
        log.info("{} 退出登录!",((Users)session.getAttribute("user")).getUserAccount());
        //session中移除用户id
        session.removeAttribute("user");
        return R.success("退出成功");
    }

    /**
     * 分页获取用户列表信息
     * <p>
     * 管理员获取用户列表，支持分页和条件筛选。
     *
     * @param page     页码
     * @param pageSize 每页大小
     * @param user     查询条件对象，包含用户筛选条件
     * @return 分页的用户列表响应
     */
    @GetMapping("/page")
    public R<Page> page(Integer page, Integer pageSize, Users user) {
        log.info("收到获取用户列表的请求,查询条件为：{}", user);
        R<Page> resp = usersService.getList(page,pageSize,user);
        return resp;
    }

    /**
     * 修改用户类型或状态
     * <p>
     * 管理员修改用户类型或状态，如设置用户为管理员或禁用用户。
     *
     * @param id   要修改的用户ID
     * @param code 修改代码，表示要修改的字段和值
     * @return 操作结果响应
     */
    @PutMapping("/{id}/{code}")
    public R<String> update(@PathVariable Long id,@PathVariable Integer code) {
        log.info("收到请求，要修改的用户编号：{}", id);
        R<String> resp = usersService.updateUserField(id,code);
        return resp;
    }

    /**
     * 修改账户信息
     * <p>
     * 用户修改自己的个人信息，如姓名、手机号等。
     *
     * @param user    包含更新信息的用户对象
     * @param session 用户会话信息，用于更新会话中的用户信息
     * @return 操作结果响应
     */
    @PutMapping
    public R<String> updateUser(@RequestBody Users user,HttpSession session){
        log.info("收到请求，修改账户信息：{}",user);
        //修改账户信息 到数据库
        usersService.updateById(user);
        //更新用户信息 session中的
        session.setAttribute("user",user);
        return R.success("修改成功！");
    }
}